home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / FREENET / BRODIE / INTERNET / !InternetD / h / inetd < prev    next >
Text File  |  1995-06-08  |  5KB  |  184 lines

  1. /* inetd.h */
  2.  
  3. /* To avoid confusion...
  4.  * inetdb_... calls are in libsocket together with a safe SWI veneer
  5.  * The SWI veneer is now SVC mode call safe (ie. it stacks R14)
  6.  */
  7.  
  8. #define socketclose    close
  9. #define socketioctl    ioctl
  10.  
  11. extern char *socket_errno_to_string(void)
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <stdarg.h>
  17. #include <errno.h>
  18. #include <ctype.h>
  19.  
  20. #include "sys/errno.h"
  21. #include "netdb.h"
  22. #include "netinet/in.h"
  23. #include "sys/socket.h"
  24. #include "sys/ioctl.h"
  25. #include "sys/byteorder.h"
  26.  
  27. #include "sys/select.h"
  28. #include "finger.h"
  29.  
  30. #ifndef UNUSED
  31. #define UNUSED(x) (x)=(x)
  32. #endif
  33.  
  34. /*---- a callback function for connections to be made ----*/
  35. typedef void (*connection_handler)(int);
  36.  
  37. /*---- a listening socket (tcp or udp) description ----*/
  38. typedef struct inet_service {
  39.         int            control_socket;
  40.         int            type;
  41.         int            active;
  42.         char            *name;
  43.         int            port;
  44.         connection_handler     connect_handler;
  45. } inet_service;
  46.  
  47. /*---- flags for indicating the capabilities of a callback, or a
  48.  *---- reason for its invocation. All combinations have a value
  49.  *---- so now |= operation are required (which then need casting
  50.  *---- to stop compiler warnings ----*/
  51. typedef enum {
  52.         worker_io_none = 0,
  53.         worker_io_read = 1,
  54.         worker_io_write = 2,
  55.         worker_io_readwrite = 3,
  56.         worker_io_except = 4,
  57.         worker_io_eread = 5,
  58.         worker_io_ewrite = 6,
  59.         worker_io_ereadwrite = 7
  60. } worker_io_flags;
  61.  
  62. /*---- status information for the chargen service ----*/
  63. typedef struct {
  64.         int    state;
  65.         int    offset;
  66. } chargen_details;
  67.  
  68. /*---- status information for the echo service ----*/
  69. typedef struct {
  70.         char    *buffer;
  71.         int    size;
  72.         int    offset;
  73. } echo_details;
  74.  
  75. /*---- status information for the finger service ----*/
  76. typedef struct {
  77.     worker_io_flags    state;
  78.         FILE        *file;
  79.         int        current_context;
  80.         int        offset;
  81. } finger_details;
  82.  
  83. /*---- status information for all services ----*/
  84. typedef union {
  85.         chargen_details     chargen;
  86.         echo_details        echo;
  87.     finger_details        finger;
  88. } service_details;
  89.  
  90. /*---- function prototype for a backgroud worker callback ----*/
  91. struct inet_handler;
  92. typedef void (*worker_function)(struct inet_handler *, worker_io_flags);
  93.  
  94.  
  95. /*---- an object representing an open connection.
  96.  *---- an array of these is maintained internally ----*/
  97. typedef struct inet_handler {
  98.         int            data_socket;
  99.         worker_function        data_handler;
  100.     worker_io_flags        flags;
  101.     service_details        data;
  102. } inet_handler;
  103.  
  104. /*---- miscellaneous status variables required by the background
  105.  *---- routines for buffers etc. ----*/
  106. typedef struct {
  107.         struct netwall    *netwall;
  108.         struct ntalk    *ntalk;
  109.         struct syslog    *syslog;
  110.     struct finger    finger;
  111. } data_details;
  112.  
  113. /*---- the system status.  Contains fd_set structures which MUST be
  114.  *---- copied to another fd_set before passing to select().
  115.  *---- Also contains a pointer to the RMA workspace for the pollword
  116.  *---- */
  117. typedef struct sys_status {
  118.         fd_set        listeners;
  119.         fd_set        workers_readers;
  120.         fd_set        workers_writers;
  121.         fd_set        workers_excepts;
  122.     int        wimp_poll_word;
  123.     inet_handler    *inets;
  124.     inet_service    *inetd;
  125.     data_details    data;
  126. } sys_status;
  127.  
  128. extern __pure sys_status     *sys(void);
  129. extern sys_status    *sys_set(sys_status *);
  130.  
  131. /* kill_socket - takes a pointer to a socket handle
  132.  * if the handle isn't -1, it shuts down the socket,
  133.  * closes it, and puts -1 in the handle
  134.  */
  135. void kill_socket(int *s);
  136.  
  137. /*---- background work processor (de)registration  ----*/
  138. inet_handler *worker_register(int s, worker_function fn, worker_io_flags);
  139. void worker_deregister(int s);
  140.  
  141. /* the local interface to the syslog call
  142.  * Note that this must not have the #pragma -v1
  143.  * declaration around it, as it may contain non-standard
  144.  * % specifiers
  145.  */
  146. void syslog(int lev, char *message, ...);
  147.  
  148.  
  149. /*---- background connect handlers ----*/
  150. extern void echo_udp(int);
  151. extern void echo_tcp(int);
  152. extern void discard_tcp(int);
  153. extern void discard_udp(int);
  154. extern void daytime_udp(int);
  155. extern void daytime_tcp(int);
  156. extern void ntalk_udp(int);
  157. extern void netwall_udp(int);
  158. extern void biff_udp(int);
  159. extern void syslog_udp(int);
  160. extern void chargen_udp(int);
  161. extern void chargen_tcp(int);
  162. extern void finger_tcp(int);
  163.  
  164. /*---- background i/o handlers ----*/
  165. extern void discard_data(inet_handler *, worker_io_flags);
  166. extern void echo_data(inet_handler *, worker_io_flags);
  167. extern void chargen_data(inet_handler *, worker_io_flags);
  168.  
  169. /*---- foreground i/o handlers ----*/
  170. extern void netwall_fg_data(inet_handler *);
  171. extern void syslog_fg_data(inet_handler *);
  172. extern void ntalk_fg_data(inet_handler *);
  173. extern void finger_fg_data(inet_handler *);
  174.  
  175. /*---- initialisation handlers ----*/
  176. extern int netwall_init(void);
  177. extern int ntalk_init(void);
  178. extern int syslog_init(void);
  179.  
  180. /*---- useful macro ----*/
  181. #define socket_non_blocking(s) ioctl(s, FIONBIO, 1)
  182.  
  183. char *socket_errno_to_string(void);
  184.